//  IIterator.hpp
//  PureMVC_C++
//
//  PureMVC Port to C++ by Tang Khai Phuong <phuong.tang@puremvc.org>
//  PureMVC - Copyright(c) 2006-2011 Futurescale, Inc., Some rights reserved.
//  Your reuse is governed by the Creative Commons Attribution 3.0 License
//
//  中文注释：
//  IIterator接口定义了PureMVC框架中的迭代器模式组件。
//  它提供了一种访问聚合对象中各个元素的方法，而又不暴露该对象的内部表示。
//  此接口是一个模板类，可以用于遍历各种类型的集合。
//

#if !defined(__PUREMVC_INTERFACES_IITERATOR_HPP__)
#define __PUREMVC_INTERFACES_IITERATOR_HPP__

// PureMVC include
#if !defined(__PUREMVC_HPP__)
#define __PUREMVC_INCLUDE__
#include "../PureMVC.hpp"
#endif /* __PUREMVC_HPP__ */

namespace PureMVC
{
    namespace Interfaces
    {
        /**
             * 迭代器类的接口
             * Interface of iterator class
             */
            template<typename _Type>
            struct IIterator
        {
            typedef _Type type;

            /**
                 * 获取当前项
                 * Gets the current item.
                 *
                 * @return 当前项的引用
                 * @return The references of current item.
                **/
                virtual _Type const& getCurrent(void) const = 0;

            /**
                 * 基于运算符获取当前项
                 * Gets the current item base on operator.
                 *
                 * @return 当前项的引用
                 * @return The references of current item.
                **/
                virtual _Type const& operator*(void) const = 0;

            /**
                 * 移动到下一项
                 * Move to next item.
                 *
                 * @return 如果成功则为true，如果失败则为false
                 * @return true if it succeeds, false if it fails. 
                **/
                virtual bool moveNext(void) const = 0;

            /**
                 * 重置迭代器
                 * Reset iterator.
                **/
                virtual void reset(void) const = 0;

            /**
                 * 虚析构函数
                 * Virtual destructor.
                 */
                virtual ~IIterator(void) { };
        };
    }
}

#endif /* __PUREMVC_INTERFACES_IITERATOR_HPP__ */
